home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / PASCAL / 0187.ZIP / NUMCNVRT.PAS < prev    next >
Pascal/Delphi Source File  |  1985-01-20  |  5KB  |  178 lines

  1. (*
  2.  * numcnvrt
  3.  * tests your ability to convert a number
  4.  * from bases
  5.  * binary -> decimal, decimal -> binary
  6.  * octal -> decimal, decimal -> octal
  7.  * binary -> octal, octal -> binary
  8.  *)
  9.  
  10. program numcnvrt (input, output);
  11.  
  12. const
  13.    base2      = 2;     (* binary *)
  14.    base8      = 8;     (* octal *)
  15.    base10     = 10;    (* decimal *)
  16.  
  17. type
  18.    base = (binary,octal,decimal);
  19.  
  20. var
  21.    i        : integer;          (* index variable *)
  22.    right    : integer;          (* number of correct gueses *)
  23.    ch       : char;             (* used to answer questions *)
  24.    frombase : base;             (* from this base *)
  25.    tobase   : base;             (* to this base *)
  26.    good     : boolean;
  27.    input    : char;
  28.  
  29. (*
  30.  * makenumber
  31.  * creates a random number of base
  32.  * first, then prints it out in base
  33.  * first. it then returns a decimal representation
  34.  * of that number
  35.  *)
  36.  
  37. function makenumber(first:base):integer;
  38.  
  39. var
  40.    temp  : string[10];
  41.    num   : integer;
  42.    index : integer;
  43.    i     : integer;
  44.  
  45. begin
  46.    num := 0;
  47.    case first of
  48.       binary : begin
  49.                   write('Binary: ');
  50.                   for index := 1 to 5 do
  51.                   begin
  52.                      i := random(base2);
  53.                      num := num * base2 + i;
  54.                      write(i:1)
  55.                   end
  56.                end;
  57.       octal : begin
  58.                  write('Octal: ');
  59.                  for index := 1 to 2 do
  60.                  begin
  61.                     i := random(base8);
  62.                     num := num * base8 + i;
  63.                     write(i:1)
  64.                  end
  65.               end;
  66.       decimal : begin
  67.                    write('Decimal: ');
  68.                    for index := 1 to 2 do
  69.                    begin
  70.                       i := random(base10);
  71.                       num := num * base10 + i;
  72.                       write(i:1)
  73.                    end
  74.                 end
  75.    end;
  76.    makenumber := num
  77. end;
  78.  
  79. (*
  80.  * getnumber
  81.  * gets a number from the user, in the
  82.  * passed base. it then checks to see
  83.  * if it is equal to the decimal answer
  84.  * it was passed. it returns a boolean indictor
  85.  * whether or not they matched
  86.  *)
  87.  
  88. function getnumber(readbase:base; answer:integer):boolean;
  89.  
  90. var
  91.    ch        : string[5];     (* input from user *)
  92.    factor    : integer;       (* multiplying factor *)
  93.    inter     : integer;       (* intermediate results *)
  94.    index     : integer;       (* index into ch *)
  95.    strlength : integer;       (* length of read in string *)
  96.  
  97. begin
  98.    write(' -> ');
  99.    case readbase of
  100.       decimal : begin
  101.                    write(' decimal: ');
  102.                    factor := base10
  103.                 end;
  104.       octal : begin
  105.                    write(' octal: ');
  106.                    factor := base8
  107.               end;
  108.       binary : begin
  109.                    write(' binary: ');
  110.                    factor := base2
  111.                end
  112.    end;
  113.    readln(ch);
  114.    strlength := length(ch);
  115.    index := 1;
  116.    inter := 0;
  117.    while (strlength >= index) do
  118.    begin
  119.       if ch[index] in ['0'..'9'] then
  120.          inter := (inter * factor) + (ord(ch[index]) - ord('0'))
  121.       else
  122.          index := strlength;
  123.       index := index + 1
  124.    end;
  125.    if inter = answer then
  126.       getnumber := true
  127.    else
  128.    begin
  129.       writeln('Wrong!!!');
  130.       getnumber := false
  131.    end
  132. end;
  133.  
  134. begin
  135.    writeln('Which would you like?');
  136.    writeln('1) Binary to decimal');
  137.    writeln('2) Binary to octal');
  138.    writeln('3) Octal to decimal');
  139.    repeat
  140.       write('Which number? ');
  141.       readln(input);
  142.       repeat
  143.       good := true;
  144.       case input of
  145.          '1' : begin
  146.                   frombase := binary;
  147.                   tobase := decimal
  148.                end;
  149.          '2' : begin
  150.                    frombase := binary;
  151.                   tobase := octal
  152.                end;
  153.          '3' : begin
  154.                    frombase := octal;
  155.                   tobase := decimal
  156.                end
  157.          else
  158.          begin
  159.             writeln('Illegal number');
  160.             write('Which number? ');
  161.             readln(input);
  162.             good := false
  163.          end
  164.       end;
  165.       until good = true;
  166.       randomize;
  167.       right := 0;
  168.       for i := 1 to 5 do
  169.          if getnumber(tobase, makenumber(frombase)) then
  170.             right := right + 1;
  171.       writeln;
  172.       writeln('You got ',right:2,' out of 10');
  173.       writeln;
  174.       writeln('Again? ');
  175.       readln(ch);
  176.    until (ch<>'y') and (ch<>'Y')
  177. end.
  178.